from collections import namedtuple

# namedtuple() 返回一个新的元组子类，且规定了元组的元素的个数，同时除了使用下标获取元素之外，还可以通过属性直接获取
# User = namedtuple("User",["name", "age", "weight"])
# user = User("admin", "20", "60")
# name, age, weight = user
# print(user[0])
# print(name, age, weight)
# print(user.name, user.age, user.weight)

 # 将序列直接转换为新的 tuple 对象
# user = ["root", 32, 65]
# User = namedtuple("User",["name", "age", "weight"])
# user = User._make(user)
# print(user)
# user = User("admin", 20, 60)
# print(user._asdict())

'''
ChainMap() 可以将多个字典集合到一个字典中去，对外提供一个统一的视图。
注意：该操作并是不将所有字典做了一次拷贝，实际上是在多个字典的上层又进行了一次封装而已
'''
# from collections import ChainMap
#
# user1 = {"name":"admin", "age":"20"}
# user2 = {"name":"root", "weight": 65}
# users = ChainMap(user1, user2)
# print(users.maps)
#
# users.maps[0]["name"] = "tiger"
# print(users.maps)
#
# for key, value in users.items():
#     print(key, value)


# dqueue 是 ”double-ended queue” 的简称，是一种类似列表(list)的容器，实现了在两端快速添加(append)和弹出(pop)操作。大大加快了遍历速度
# from collections import deque
# q = deque([1, 2, 3])
# q.append('4')
# q.appendleft('0')
# print(q)
# print(q.popleft())

# Counter 可以简单理解为一个计数器，可以统计每个元素出现的次数，同样 Counter() 是需要接受一个可迭代的对象的
# from collections import Counter
# animals = ["cat", "dog", "cat", "bird", "horse", "tiger", "horse", "cat"]
# animals_counter = Counter(animals)
# print(animals_counter)
# print(animals_counter.most_common(1))
'''
算法上， OrderedDict 可以比 dict 更好地处理频繁的重新排序操作。在跟踪最近的访问这种场景（例如在 LRU cache）下非常适用。
OrderedDict 类有一个 move_to_end() 方法，可以有效地将元素移动到任一端
'''
# from collections import OrderedDict
# user = OrderedDict()
# user["name"] = "admin"
# user["age"] = 23
# user["weight"] = 65
# print(user)
# user.move_to_end("name") # 将元素移动至末尾
# print(user)
# user.move_to_end("name", last = False) # 将元素移动至开头
# print(user)

# defaultdict 是内置 dict 类的子类。它实现了当 key 不存在是返回默认值的功能，除此之外，与内置 dict 功能完全一样

from collections import defaultdict

default_dict = defaultdict(int)
default_dict["x"] = 10
# print(default_dict["x"])
# print(default_dict["y"])

def getUserInfo():
    return {
        "name" : "",
        "age" : 0
    }

default_dict = defaultdict(getUserInfo)
admin = default_dict["admin"]
print(admin)

admin["age"] = 34
print(admin)